home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1998 / MacHack 1998.toast / The Hacks! / ReverseMouse / main.c next >
C/C++ Source or Header  |  1998-05-09  |  4KB  |  169 lines

  1. // Program Author: Paul Baxter 
  2. // pbaxter@assistivetech.com
  3. //
  4.  
  5. #include <DeskBus.h>
  6. #include "ShowInit.h"
  7.  
  8.  
  9. #ifndef powerc
  10. #pragma error Sorry this only works on a real machine
  11. #endif
  12.  
  13. // Control Flags....What do you want this hack to do?
  14. #define REVERSE_DIRECTION            1
  15. #define CHANGE_BUTTON_STATE            0
  16. #define SWAP_AXIS                    0
  17.  
  18. #define kMouseADBAddress            3
  19. #define TwosComplement(n)              ((~(n)) + 1)
  20.  
  21. #define kIconID                        128
  22. #define kNoInstallID                129
  23.  
  24. #define kButtonStateMask            0x80
  25. #define kValueMask                    0x7F
  26.  
  27.  
  28. // Where is this defined??
  29. extern    ADBInitUPP JADBProc : 0x06B8;
  30.  
  31. ADBInitUPP    gOldADBInitProc;
  32. ADBServiceRoutineUPP gMouseServiceRoutine = nil;
  33. ADBServiceRoutineUPP gOldMouseServiceRoutine = nil;
  34. ADBDataBlock gMouseADBinfo;
  35.  
  36. extern Boolean InstallServiceRoutines(void);
  37. extern void InstallJADBProc(void);
  38. extern void MyADBInitProc(SInt8 callOrder);
  39. extern  pascal void ADBMouseServiceRoutine(Ptr buffer, TempADBServiceRoutineUPP completionProc,  long refCon, long command);
  40.  
  41. #ifdef powerc
  42.     // for Metrowerks' linker, this defines the interface for main().
  43.     ProcInfoType __procinfo = kCStackBased | RESULT_SIZE(kNoByteCode);
  44. #endif
  45.         
  46. // Main entry point
  47. void main(void)
  48. {
  49.     Handle ourhandle;
  50.     Boolean InstalledOK = false;
  51.     THz    pZone;
  52.  
  53.     pZone = GetZone();
  54.     SetZone(SystemZone());
  55.     ourhandle = Get1IndResource('INIT', 1);
  56.     if (ourhandle)  {
  57.         DetachResource(ourhandle);
  58.         HLock(ourhandle);
  59.         HNoPurge(ourhandle);
  60.  
  61.         // take over the ADBServiceRoutine for the Mouse
  62.         InstalledOK = InstallServiceRoutines();
  63.         if (InstalledOK) {
  64.             // Install a JADBProc so we don't go away after a ADBReInit
  65.             InstallJADBProc();
  66.         }
  67.  
  68.     }
  69.     if (InstalledOK)
  70.         ShowINIT(kIconID, -1);
  71.     else
  72.         ShowINIT(kNoInstallID, -1);
  73.  
  74.     SetZone(pZone);
  75. }
  76.  
  77. // Setup our service routines
  78. Boolean InstallServiceRoutines(void)
  79. {
  80.     long adbaddr;
  81.     ADBDataBlock adb_data;
  82.     ADBSetInfoBlock setADBInfo;
  83.     short adbcount, adbindex;
  84.     OSErr err;
  85.  
  86.     err = -1;
  87.     adbcount = CountADBs();
  88.     for (adbindex = 1; adbindex <= adbcount; adbindex++) {
  89.         adbaddr = GetIndADB(&adb_data,adbindex);
  90.     
  91.         if ((adb_data.origADBAddr == kMouseADBAddress)) {
  92.             BlockMoveData(&adb_data, &gMouseADBinfo, sizeof(ADBDataBlock));
  93.             // Remember we will be called once to install and twice during each ADBReInit
  94.             if (!gMouseServiceRoutine) {
  95.                 gMouseServiceRoutine = NewADBServiceRoutineProc(ADBMouseServiceRoutine);
  96.             }
  97.             if (!gMouseServiceRoutine)
  98.                 return err == noErr;
  99.  
  100.             gOldMouseServiceRoutine = adb_data.dbServiceRtPtr;
  101.             setADBInfo.siService = gMouseServiceRoutine;
  102.             setADBInfo.siDataAreaAddr = adb_data.dbDataAreaAddr;
  103.  
  104.             err = SetADBInfo(&setADBInfo, adbaddr);
  105.             break;
  106.         }
  107.     }
  108.     return err == noErr;
  109. }
  110.  
  111. // Install a JADBProc callback for before and after ADBReInit
  112. void InstallJADBProc(void)
  113. {
  114.     ADBInitUPP ourADBInitProc;
  115.  
  116.     gOldADBInitProc = JADBProc;
  117.     ourADBInitProc = NewADBInitProc(MyADBInitProc);
  118.     JADBProc = ourADBInitProc;
  119. }
  120.  
  121. // Handler for Mouse service routine
  122. pascal void ADBMouseServiceRoutine(Ptr buffer, TempADBServiceRoutineUPP completionProc, long refCon, long command)
  123. {
  124. #pragma unused (refCon)
  125.     unsigned char num, buttonstate, count;
  126.  
  127.     for (count = 0; count < buffer[0]; count++) {
  128.         // high most bit is the button state
  129.         // get the x and y data and take the 2's complement to reverse direction
  130.  
  131.         buttonstate = buffer[count + 1] & kButtonStateMask;
  132.         num = buffer[count + 1] & kValueMask;
  133.  
  134. #if REVERSE_DIRECTION
  135.         // swap left right and up down
  136.         num = TwosComplement(num);
  137. #endif
  138.         buffer[count + 1] = (num & kValueMask) | (buttonstate & kButtonStateMask);
  139.     }
  140.  
  141. #if CHANGE_BUTTON_STATE
  142.     // swap button up and button down
  143.     buffer[1] = (buffer[1] & kValueMask) | (~(buffer[1]) & kButtonStateMask);
  144. #endif
  145.  
  146. #if SWAP_AXIS
  147.     // swap x and y axis
  148.     for (count = 1; count < buffer[0]; count++) {
  149.         unsigned char temp, temp2;
  150.  
  151.         temp = buffer[count];
  152.         temp2 = buffer[count + 1];
  153.         buffer[count] = (temp2 & kValueMask) | (temp & kButtonStateMask);
  154.         buffer[count + 1] = (temp & kValueMask) | (temp2 & kButtonStateMask);
  155.     }
  156. #endif
  157.  
  158.     CallADBServiceRoutineProc(gOldMouseServiceRoutine, buffer, completionProc, (long)gMouseADBinfo.dbDataAreaAddr, command);
  159. }
  160.  
  161. // needed to re-install our service routine
  162. void MyADBInitProc(SInt8 callOrder)
  163. {
  164.     Boolean        InstallOK;
  165.  
  166.     CallADBInitProc(gOldADBInitProc, callOrder);
  167.     if (callOrder)
  168.         InstallOK = InstallServiceRoutines();
  169. }